定期ミートアップ 第18回
概要
問題点
ShiikaはGC言語だが、Rustはそうではない
Rust
std::fs::File::Openでファイルを開く
スコープを抜けたときにDropされ、ファイルが閉じられる
RubyでいうFile#closeみたいなものはないのか?
shiikaの場合
raviqqeさんのbdwgc-alloc crateを使っている
ので、Rustレベルの操作(lib/skc_rustlib)であってもメモリ確保自体はbdwgc経由で行われる
→ ShiikaのFileオブジェクトがGCされても、RustのDropは呼ばれないのでファイルが閉じられないのではないか(予想)
確認する
ファイルを開いているプロセスはlsofで見れる
例
code:console
$ lsof hello.txt
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
a.sk.out 1554 yhara 6r REG 1,4 10 8630266199 hello.txt
ShiikaでFile.openを行ったあと、sleepで止めて、lsofする
GCを強制発動させるには?
GC_gcollectを呼べばいいらしい
bdwgc-allocは未対応なので手元で適当に手を入れる(そのうちプルリクします)
GC後もやはり閉じられていなかった
File#closeを作る
RustではDropを明示的に呼ぶことはできないらしい?
Optionにしておいて、takeで取り出して破棄させるとどうなるか
ファイルが閉じられた
GCでファイルが閉じられるようにする
bdwgcのGC_register_finalizerを呼べばよいはず
code:rust
fn GC_register_finalizer(
obj: *const c_void,
f: extern "C" fn(*mut c_void, *mut c_void), // obj, client_data
client_data: *const c_void,
opt_old_f: *const c_void, // 非NULLのとき、もとのfが返る
opt_old_cd: *const c_void, // 非NULLのとき、もとのclient_dataが返る
) -> *mut c_void;